const Metalsmith = require('metalsmith')
const Handlebars = require('handlebars')
const rm = require('rimraf').sync
const chalk = require('chalk')
const _ = require('lodash')

module.exports = function (metadata = {}, source, destination = '.') {
  if (!source) {
    return Promise.reject(new Error(`无效的source：${source}`))
  }
 
  return new Promise((resolve, reject) => {
    Metalsmith(process.cwd())
      .metadata(metadata) //metadata 为用户输入的内容
      .clean(false)
      .source(source) //模板文件 path
      .destination(destination) //最终编译好的文件存放位置
      .use((files, metalsmith, done) => {
        Object.keys(files).forEach(fileName => { //遍历每个文件替换模板
          if (fileName == "package.json") // lululu add，只遍历package.json文件
          {
            if (!_.startsWith(fileName, 'src/font')) { //判断是否为字体文件，字体文件不用替换
              const fileContentsString = files[fileName].contents.toString() // 文件具体内容（还未进行handlebar替换）
              files[fileName].contents = new Buffer.from(Handlebars.compile(fileContentsString)(metalsmith.metadata())) // handlebar替换模板内容字符串，Metalsmith生成最终文件（不能用Buffer要用Buffer.from不然会报错）
            }
          }
        })
        done()
      }).build(err => {
        rm(source)  //删除下载下来的模板文件，source是模板路径
        if (err) {
          console.log(chalk.red(`Metalsmith 生成项目错误: ${err}`))
          return reject(err)
        } else {
          return resolve()
        }
      })
  })
}